package database

import (
	"fmt"
)

func ListAncestorsByIds(ids []int64) []string {
	var ancestors []string

	// 查询资源ID
	db.Table("document").
		Select("ancestors").
		Where("id in ? ", ids).
		Pluck("resource_id", &ancestors)

	return ancestors
}
func ListDocumentByIds(ids []int64) []Document {
	var documents []Document

	// 查询文档信息并进行排序
	db.Table("document").
		Where("id IN (?)", ids).
		Order("level ASC, id ASC").
		Find(&documents)

	return documents
}

// GetById 根据Id查询文档
func GetById(id int64) Document {
	var document Document

	tx := db.First(&document, id)
	if err := tx.Error; err != nil {
		panic(tx.Error)
	}

	return document
}

// FindAll 查询所有
func FindAll() []Document {
	var documents []Document

	// 查询表中的所有数据
	db.Find(&documents)

	return documents
}

// UpdateContent 更新内容
func UpdateContent(id int64, content string) {
	// 查询表中的所有数据
	if err := db.Model(&Document{}).Where("id = ?", id).UpdateColumn("content", content).Error; err != nil {
		panic(err)
	}
}

// UpdateContent 更新内容
func InsertDocument(doc Document) int64 {
	// 使用 GORM 的 Create 方法插入数据
	result := db.Create(&doc)
	if result.Error != nil {
		// 插入数据失败 TODO
		panic("新增失败")
	} else {
		// 插入数据成功
		return doc.ID
	}
}

// UpdateParentId 移动到指定文档下
func UpdateParentId(id, parentId int64) {
	// update
	if err := db.Model(&Document{}).Where("id = ?", id).UpdateColumn("parent_id", parentId).Error; err != nil {
		panic(err)
	}
}

// DeleteDocument 更新内容
func DeleteDocument(id int64) {
	document := Document{ID: id}
	// 查询表中的所有数据
	if err := db.Delete(&document).Error; err != nil {
		panic(err)
	}
}

func UpdateDocument(doc *Document) error {
	// 判断文档是否存在 TODO
	document := GetById(doc.ID)
	if &document == nil {
		panic("文档不存在")
	}

	// 构建要更新的列
	setColumns := make(map[string]interface{})
	if doc.ParentID != 0 {
		setColumns["parent_id"] = doc.ParentID
	}
	if doc.Level != 0 {
		setColumns["level"] = doc.Level
	}
	if doc.Ancestors != "" {
		setColumns["ancestors"] = doc.Ancestors
	}
	if doc.Title != "" {
		setColumns["title"] = doc.Title
	}
	if doc.Author != 0 {
		setColumns["author"] = doc.Author
	}
	if doc.Content != "" {
		setColumns["content"] = doc.Content
	}
	if !doc.CreateTime.IsZero() {
		setColumns["create_time"] = doc.CreateTime
	}
	if !doc.UpdateTime.IsZero() {
		setColumns["update_time"] = doc.UpdateTime
	}

	// 执行更新操作
	if err := db.Model(&Document{}).Where("id = ?", doc.ID).Updates(setColumns).Error; err != nil {
		return fmt.Errorf("update document failed: %w", err)
	}

	return nil
}

func GetDocumentsByGroupIds(groupIds []int64) ([]Document, error) {
	var documents []Document
	if len(groupIds) == 0 {
		return documents, nil
	}
	sql := ("SELECT document.* FROM document  LEFT JOIN group_permission ON group_permission.resource_id=document.id  WHERE group_permission.resource_type='document' AND group_permission.group_id IN (?)")
	res := db.Raw(sql, groupIds).Find(&documents)
	if err := res.Error; err != nil {
		return nil, err
	}
	return documents, nil
}

func GetDocumentsByUserId(userId int64) ([]Document, error) {
	var documents []Document
	sql := "SELECT document.* FROM document LEFT JOIN user_permission ON user_permission.resource_id=document.id WHERE user_permission.resource_type='document' AND user_permission.user_id = ?"
	res := db.Raw(sql, userId).Find(&documents)
	if err := res.Error; err != nil {
		return nil, err
	}
	return documents, nil
}
func GetDocumentsByIds(ids []int64) ([]Document, error) {
	var documents []Document
	sql := "SELECT document.* FROM document WHERE id in ?"
	res := db.Raw(sql, ids).Find(&documents)
	if err := res.Error; err != nil {
		return nil, err
	}
	return documents, nil
}
